/*
 *  Лицензия MIT
 * 
 *  Copyright 2011 Salnikov Aleksey.
 * 
 *  Данная лицензия разрешает, безвозмездно, лицам, получившим копию данного программного обеспечения
 *  и сопутствующей документации (в дальнейшем именуемыми "Программное Обеспечение"),
 *  использовать Программное Обеспечение без ограничений, включая неограниченное право
 *  на использование, копирование, изменение, объединение, публикацию, распространение,
 *  сублицензирование и/или продажу копий Программного Обеспечения, также как и лицам,
 *  которым предоставляется данное Программное Обеспечение, при соблюдении следующих условий:
 * 
 *  Вышеупомянутый копирайт и данные условия должны быть включены во все копии или значимые
 *  части данного Программного Обеспечения.
 * 
 *  ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ ЛЮБОГО ВИДА ГАРАНТИЙ,
 *  ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ,
 *  СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И НЕНАРУШЕНИЯ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ
 *  НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ ИЛИ ДРУГИХ ТРЕБОВАНИЙ
 *  ПО ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ, ИМЕЮЩИМ ПРИЧИНОЙ ИЛИ СВЯЗАННЫМ
 *  С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
 *  ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
 */

package CommonTools;

import java.rmi.RemoteException;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;

/**
 *
 *
 * @author Salnikov Aleksey
 */
public class DemandsTModel implements TableModel
{

        //Слушатели событий
    private Set<TableModelListener> listeners = new HashSet<TableModelListener>();

    //Заявки
    private List<Demand> demands = null;
    private List<Admin> admins;

    //Конструктор
    public DemandsTModel(List<Demand> demands) throws SQLException, RemoteException
    {
        this.demands = demands;
        this.admins = Actions.getAllAdmins();
    }

    //Добавление слушателей событий
    public void addTableModelListener(TableModelListener listener)
    {
        listeners.add(listener);
    }

    //Удаление слушателя
    public void removeTableModelListener(TableModelListener listener)
    {
        listeners.remove(listener);
    }

    //Получение типа поля
    public Class<?> getColumnClass(int columnIndex)
    {
        return String.class;
    }

    //Получение количества полей
    public int getColumnCount()
    {
        return 6;
    }

    //Получение заголовка столбца
    public String getColumnName(int columnIndex)
    {
        if (columnIndex == 0)
            return "Пользователь";
        else
            if (columnIndex == 1)
                return "Важность";
            else
                if (columnIndex == 2)
                    return "Статус";
                else
                    if (columnIndex == 3)
                        return "Дата поступления";
                    else
                        if (columnIndex == 4)
                            return "Дата выполнения";
                        else
                            return "Ответственный";
    }

    //Получение количества строк
    public int getRowCount()
    {
        return demands.size();
    }

    //Что отображать
    public Object getValueAt(int rowIndex, int columnIndex)
    {
        Demand demand = demands.get(rowIndex);
        try
        {
            if (columnIndex == 0)
                return demand.getUser();
            else
                if (columnIndex == 1)
                    return demand.getCrit();
                else
                    if (columnIndex == 2)
                        return demand.getStatus();
                    else
                        if (columnIndex == 3)
                            return demand.getTimeString();
                        else
                            if (columnIndex == 4)
                            {
                                //if (!demand.getTimeExecString().equals("01.01.1970 03:00")
                                if (demand.getTimeExec() != 0)
                                    return demand.getTimeExecString();
                                else return "Не выполнена";
                            }
                            else
                            {
                                int id = demand.getTId();
                                if ((id != 0))
                                {
                                    Admin admin = null;
                                    for (int i = 0; i<admins.size(); i++)
                                    {
                                        admin = admins.get(i);
                                        if (admin.getId() == id)
                                            break;
                                    }
                                    return admin.getFam() + ' ' + admin.getName() + ' ' + admin.getOtch();
                                }
                                else return "Не назначен";
                            }
        }
        catch (Exception e)
        {
            return null;
        }
    }

    //Могут ли редактироваться строки
    public boolean isCellEditable(int rowIndex, int columnIndex)
    {
        return false;
    }


    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        
    }

    //Возвращение заявки
    public Demand getDemandAt(int rowIndex)
    {
        try
        {
            return demands.get(rowIndex);
        }
        catch (Exception e)
        {
            return null;
        }
    }

    /**
     * Функция получения администратора, который отвечает за данную заявку
     * @param demand
     * @return
     */
    public Admin getAdmin(Demand demand)
    {
        int idAdmin = demand.getTId();

        //Бежим по админам и сравниваем их айдишники
        for (int i = 0; i < admins.size(); i++)
            if (admins.get(i).getId() == idAdmin)
                return admins.get(i);

        //Если не нашел админа
        return null;
    }

    public List<Demand> getDemands()
    {
        return this.demands;
    }

}
